ea6d0333191d134a1ac27e6d2eaf2f6bf69cec34,app/src/main/java/home/smart/fly/animationdemo/property/ShopCarAddAnimActivity.java,ShopCarAddAnimActivity,addToCarAnimation,#ImageView#,58

Before Change



        // 匀速线性�值器
        valueAnimator.setInterpolator(new LinearInterpolator());
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                // 当�值计算进行时,获�中间的�个值,
                // 这里这个值是中间过程中的曲线长度(下é?¢æ ¹æ?®è¿™ä¸ªå€¼æ?¥å¾—出中间点的å??标值)
                float value = (Float) animation.getAnimatedValue();
                // 获å?–当å‰?点å??æ ‡å°?装到mCurrentPosition
                // boolean getPosTan(float distance, float[] pos, float[] tan) :
                // 传入一个è·?离distance(0<=distance<=getLength()),然å?Žä¼šè®¡ç®—当å‰?è·?离的å??标点和切线,pos会自动填充上å??标,这个方法很é‡?è¦?。
                // mCurrentPosition此时就是中间è·?离点的å??标值
                mPathMeasure.getPosTan(value, mCurrentPosition, null);
                // 移动的商å“?图片(动画图片)的å??标设置为该中间点的å??æ ‡
                animImg.setTranslationX(mCurrentPosition[0]);
                animImg.setTranslationY(mCurrentPosition[1]);
            }
        });

//         开始执行动画
        valueAnimator.start();

        valueAnimator.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                super.onAnimationEnd(animation);
                goodsCount++;
                carCount.setText(String.valueOf(goodsCount));
                // 把执行动画的商�图片从父布局中移除
                shellLayout.removeView(animImg);
            }
        });


    }

After Change



        // 属性动画实现(从0到�塞尔曲线的长度之间进行�值计算,获�中间过程的�离值)
        ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, mPathMeasure.getLength());
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                // 当�值计算进行时,获�中间的�个值,
                // 这里这个值是中间过程中的曲线长度(下é?¢æ ¹æ?®è¿™ä¸ªå€¼æ?¥å¾—出中间点的å??标值)
                float value = (Float) animation.getAnimatedValue();
                // 获å?–当å‰?点å??æ ‡å°?装到mCurrentPosition
                // boolean getPosTan(float distance, float[] pos, float[] tan) :
                // 传入一个è·?离distance(0<=distance<=getLength()),然å?Žä¼šè®¡ç®—当å‰?è·?离的å??标点和切线,pos会自动填充上å??标,这个方法很é‡?è¦?。
                // mCurrentPosition此时就是中间è·?离点的å??标值
                mPathMeasure.getPosTan(value, mCurrentPosition, null);
                // 移动的商å“?图片(动画图片)的å??标设置为该中间点的å??æ ‡
                animImg.setTranslationX(mCurrentPosition[0]);
                animImg.setTranslationY(mCurrentPosition[1]);
            }
        });


        valueAnimator.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                super.onAnimationEnd(animation);
                goodsCount++;
                carCount.setText(String.valueOf(goodsCount));
                // 把执行动画的商�图片从父布局中移除
                shellLayout.removeView(animImg);
            }
        });

        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.setDuration(1000);